package com.mask.token.util;

import javax.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;

/**
 * Token工具类
 * 提供Token相关的工具方法
 *
 * @author mask
 * @since 1.0.0
 */
public class MaskTokenUtil {

    /**
     * Token请求头名称
     */
    public static final String TOKEN_HEADER = "Authorization";
    
    /**
     * Token前缀
     */
    public static final String TOKEN_PREFIX = "Bearer ";

    /**
     * 从请求中获取Token
     *
     * @param request HTTP请求
     * @return Token字符串，如果不存在则返回null
     */
    public static String getTokenFromRequest(HttpServletRequest request) {
        String bearerToken = request.getHeader(TOKEN_HEADER);
        
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(TOKEN_PREFIX)) {
            return bearerToken.substring(TOKEN_PREFIX.length());
        }
        
        return null;
    }

    /**
     * 从请求中获取Token（支持多种方式）
     *
     * @param request HTTP请求
     * @return Token字符串，如果不存在则返回null
     */
    public static String getTokenFromRequestMulti(HttpServletRequest request) {
        // 1. 从Authorization头获取
        String token = getTokenFromRequest(request);
        if (StringUtils.hasText(token)) {
            return token;
        }
        
        // 2. 从请求参数获取
        token = request.getParameter("token");
        if (StringUtils.hasText(token)) {
            return token;
        }
        
        // 3. 从Cookie获取
        if (request.getCookies() != null) {
            for (javax.servlet.http.Cookie cookie : request.getCookies()) {
                if ("token".equals(cookie.getName())) {
                    return cookie.getValue();
                }
            }
        }
        
        return null;
    }

    /**
     * 构建完整的Token头
     *
     * @param token Token字符串
     * @return 完整的Token头
     */
    public static String buildTokenHeader(String token) {
        return TOKEN_PREFIX + token;
    }

    /**
     * 检查Token格式是否正确
     *
     * @param token Token字符串
     * @return 是否为有效格式
     */
    public static boolean isValidTokenFormat(String token) {
        return StringUtils.hasText(token) && !token.contains(" ");
    }
}
